package info.motteke.mixivoice4j.http.json;

/**
 * JSONリクエストの基底クラスです。
 *
 * @author Y.Wakamatsu
 *
 * @param <P>
 *            リクエストに設定されるパラメータ。
 */
public abstract class JsonRequest<P> extends JsonBase {

    /** リクエストのメソッドです。 */
    private final String method;

    /** リクエストに付加されるパラメータです。 */
    private final P params;

    /**
     * コンストラクタです。
     *
     * @param method
     *            このリクエストのメソッド名
     * @param jsonrpc
     *            このリクエストのJSONRPC
     * @param id
     *            このリクエストのID
     */
    protected JsonRequest(String method, String jsonrpc, int id) {
        params = createParam();
        this.method = method;
        super.setJsonrpc(jsonrpc);
        super.setId(id);
    }

    /**
     * リクエストは、IDを設定できません。
     *
     * @throws UnsupportedOperationException
     *             常に発生します。
     */
    @Override
    public void setId(int id) {
        throw new UnsupportedOperationException("setId()は利用できません。");
    }

    /**
     * リクエストは、JsonRPCを設定できません。
     *
     * @throws UnsupportedOperationException
     *             常に発生します。
     */
    @Override
    public void setJsonrpc(String jsonrpc) {
        throw new UnsupportedOperationException("setJsonrpc()は利用できません。");
    }

    /**
     * このリクエストのメソッド名を返します。
     */
    public String getMethod() {
        return method;
    }

    /**
     * このリクエストのパラメータを返します。
     */
    public P getParams() {
        return params;
    }

    /**
     * このリクエストのパラメータを作成して返します。
     */
    protected abstract P createParam();
}
